[toc]
python基础二十五 并发编程-多线程
1.线程概念
线程:实现多任务的另一种方式,一个进程中同时运行的多个子任务就成为线程
轻量级进程:线程又被称为轻量级进程,是更小的执行单元
- 一个进程可拥有多个并行的线程,当中每一个线程,共享当前进程的资源
- 一个进程中的线程共享相同的内存单元/内存地址空间,这样就可以访问相同的变量和对象,而且他们从同一堆中分配对象,进行通信、数据交换、同步操作
- 线程间的通信是在同一个地址上进行的,所以不需要额外的通信机制,这就使得通信更简单而且信息传递速度也更快
线程的5种状态
- 多线程程序的执行顺序是不确定的(操作系统决定)。当执行到sleep语句时,线 程将被阻塞(Blocked) , 到sleep结束后, 线程进入就绪(Runnable) 状态, 等待调度。 而线程调度将自行选择一个线程执行。 代码中只能保证每个线程都运行 完整个run函数, 但是线程的启动顺序、run函数中每次循环的执行顺序都不能确定
1、新状态
:线程对象已经创建,还没有在其上调用start()方法。
2、可运行状态
:当线程有资格运行,但调度程序还没有把它选定为运行线程时线程所处的状态。当start()方法调用时,线程首先进入可运行状态。在线程运行之后或者从阻塞、等待或睡眠状态回来后,也返回到可运行状态。
3、运行状态
:线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一一种方式。
4、等待/阻塞/睡眠状态
:这是线程有资格运行时它所处的状态。实际上这个三状态组合为一种,其共同点是:线程仍旧是活的(可运行的),但是当前没有条件运行。 但是如果某件事件出现,他可能返回到可运行状态。
5、死亡态
:当线程的run()方法完成时就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程,线程一旦死亡,就不能再次执行,如果在一个死去的线程上调用start()方法,会抛出异常
2.线程和进程的区别
区别 | 进程 | 线程 |
---|---|---|
根本区别 | 作为资源分配的单位 | 调度和执行的单位 |
开销 | 每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销 | 线程可以看成是轻量级的进程,同一个类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小 |
所处环境 | 在操作系统中能同时运行多个任务 | 在同一个应用程序中有多个顺序流同时执行 |
分配内存 | 系统在运行的时候会为每个进程分配不同的内存区域 | 除了CPU之外,不会为线程分配内存,线程使用的资源是它所属的进程的资源,线程只能共享资源 |
包含关系 | 没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个线程,则执行过程不是一个线程,而是多个线程完成的 | 线程是进程的一部分,所以线程有的时候被称为是轻权进程或者轻量进程 |
3.多线程实现
3.1 通过threading.Thread直接在线程中运行函数
//创建单线程
import threading #导入threading模块
def thread():
print("线程启动")
t = threading.Thread(target=thread) #创建线程
t.start() #启动线程
//利用for循环创建多线程
import threading
def thread():
print("子线程启动")
for i in range(5):
t = threading.Thread(target=thread)
t.start()
结果:
子线程启动
子线程启动
子线程启动
子线程启动
子线程启动